// 导入 http 模块
import http from 'wechat-http'
// 基础路径
http.baseURL = 'https://live-api.itheima.net'

// 配置请求拦截器
http.intercept.request = function (options) {
  // 扩展头信息
  const defaultHeader = {}
  // 身份认证 - 添加存在性判断
  const app = getApp()
  if (app && app.token) {
    defaultHeader.Authorization = `Bearer ${app.token}`
  }
  // 与默认头信息合并
  options.header = Object.assign({}, defaultHeader, options.header)
  // 处理后的请求参数
  return options
}

// 配置响应拦截器
http.intercept.response = async function ({
  data,
  config
}) {
  // 如果状态码为401则表明token已经失效
  if (data.code === 401) {
    // 获取应用实例来读取refreshToken
    const app = getApp()

    // 如果接口为 /refreshToken 表明 refreshToken 也过期了
    if (config.url.includes('/refreshToken')) {
      // 获取当前页面的路径，保证登录之后能够跳回到原来的页面
      const pageStack = getCurrentPages()
      const currentPage = pageStack.pop()
      const redirectURL = currentPage ? currentPage.route : ''
      // 路由跳转到登录页面
      return wx.redirectTo({
        url: `/pages/login/index?redirectURL=/${redirectURL}`
      })
    }

    // 检查refreshToken是否存在
    if (!app || !app.refreshToken) {
      wx.showToast({
        title: '请先登录',
        icon: 'none',
        duration: 2000
      })
      // 跳转到登录页
      return wx.redirectTo({
        url: '/pages/login/index'
      })
    }

    try {
      // 调用接口获取新的token
      const res = await http({
        url: '/refreshToken',
        method: 'POST',
        header: {
          Authorization: `Bearer ${app.refreshToken}`
        },
      })

      // 检验token是否调用成功
      if (res.code !== 10000) {
        wx.showToast({
          title: '更新token失败',
          icon: 'none',
          duration: 2000
        })
        // 跳转到登录页
        return wx.redirectTo({
          url: '/pages/login/index'
        })
      }

      // 获取到token之后，重新存储新的token
      app.setToken('token', res.data.token)
      app.setToken('refreshToken', res.data.refreshToken)

      // 重新设置原来的接口请求参数
      config = Object.assign({}, config, {
        header: Object.assign({}, config.header, {
          // 更新后的token
          Authorization: `Bearer ${res.data.token}`
        })
      })

      // 重新发请求
      return http(config)
    } catch (error) {
      wx.showToast({
        title: '请求失败，请重试',
        icon: 'none',
        duration: 2000
      })
      return Promise.reject(error)
    }
  }

  // 只保留data数据，其他的过滤掉
  return data
}

// 挂载到全局对象
wx.http = http
// 普通的模块导出
export default http